package TCP网络编程;

import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 实现TCP的网络编程
 * 例子1：客户端发送信息给服务端，服务端将数据显示在控制台上
 */

public class 客户端发送信息给服务端 {
    //客户端
    @Test
    public void client() {
        Socket soc = null;
        OutputStream ops = null;
        try {
            //1.创建Socket对象，指明服务器端的ip和端口号

            //InetAddress inet=InetAddress.getByName("127.0.0.1");    //获取一个服务器地址
            //soc = new Socket(inet,8806);    //Socket创建时要指明服务器地址与端口号
            soc = new Socket("127.0.0.1", 8806);    //Socket创建时要指明服务器地址与端口号
            //2.获取一个输出流，用于输出数据；通过Socket的getOutputStream()方获取
            ops = soc.getOutputStream();//字节流

            //3.写出数据的操作
            ops.write("你好！我是客户端。".getBytes());//调用String类中的getBytes()方法，将字符串转换对应的字节序列输出
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.资源的关闭
            if (ops != null) {
                try {
                    ops.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if (soc != null) {
                try {
                    soc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

    }

    //服务端
    @Test
    public void serviceClient() {
        ServerSocket ss = null;//就是客户端需要连接的端口号
        Socket ssoc = null;
        InputStream ips = null;
        ByteArrayOutputStream baos = null;

        try {
            //1.创建服务器端的ServerSocket，指明自己的端口号
            ss = new ServerSocket(8806);

            //2.调用accept()表示接收来自于客户端的socket,返回值也是socket类型
            ssoc = ss.accept();
            //3.获取输入流,通过Socket的getInputStream()方获取
            ips = ssoc.getInputStream();//字节流

            //4.读取输入流中的数据，创建字节数组输出流来接收数据
            baos = new ByteArrayOutputStream();//这个类底层其实就是创建了一个长度32的字节数组
            byte[] bytes = new byte[5];//创建一个长度为5的字节数组，作为每次接收数据的长度
            int len;//每次读取数据的长度
            while ((len = ips.read(bytes)) != -1) {//判断是否读完，读完返回-1
                baos.write(bytes, 0, len);//向字节数组输出流，写入数据
            }
            System.out.println(baos.toString());//输出字节数组输出流中的字符数据

            System.out.println("收到了来自于：" + ssoc.getInetAddress().getHostAddress() + "的数据");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //5.关闭资源
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if (ips != null) {
                try {
                    ips.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if (ssoc != null) {

                try {
                    ssoc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if (ss != null) {

                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }

}
